# -*-coding:utf-8 -*-
#!/usr/bin/env python
#function: 0-9标准字符识别——基于汉明距离
#input:字符提取结果（png图像）
#output:识别出的匹配数字

import cv2
import numpy as np
import os


# 法一、平均哈希算法计算 
def classify_aHash(image1,image2): 
    image1 = cv2.resize(image1,(16,16)) 
    image2 = cv2.resize(image2,(16,16))
    gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) 
    gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)   
    hash1 = getHash(gray1) 
    hash2 = getHash(gray2) 
    return Hamming_distance(hash1,hash2)

# 法二、感知hash算法
def classify_pHash(image1,image2): 
    image1 = cv2.resize(image1,(32,32)) 
    image2 = cv2.resize(image2,(32,32)) 
    gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) 
    gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) 
    # 将灰度图转为浮点型，再进行dct变换 
    dct1 = cv2.dct(np.float32(gray1)) 
    dct2 = cv2.dct(np.float32(gray2)) 
    # 取左上角的8*8，这些代表图片的最低频率 
    # 这个操作等价于c++中利用opencv实现的掩码操作 
    # 在python中进行掩码操作，可以直接这样取出图像矩阵的某一部分 
    dct1_roi = dct1[0:8,0:8] 
    dct2_roi = dct2[0:8,0:8] 
    hash1 = getHash(dct1_roi) 
    hash2 = getHash(dct2_roi) 
    return Hamming_distance(hash1,hash2)

# 输入灰度图，返回hash 
def getHash(image): 
    avreage = np.mean(image) 
    hash = [] 
    for i in range(image.shape[0]): 
        for j in range(image.shape[1]): 
            if image[i,j] > avreage: 
                hash.append(1) 
            else: 
                hash.append(0) 
    return hash 


# 计算汉明距离 
def Hamming_distance(hash1,hash2): 
    num = 0 
    for index in range(len(hash1)): 
        if hash1[index] != hash2[index]: 
            num += 1 
    return num 


#字符识别(输入待识别字符png和匹配库路径）
def char_rec(img,libpath, detail=0):
    #读取库文件
    libchar_list = os.listdir(libpath)
    
    #计算待匹配图像与库文件的不相似度
    distance=[]    
    for path in libchar_list:
        libchar = cv2.imread(libpath+'\\'+path)
        dist = classify_aHash(img,libchar)      #采用法1或者法2
        distance.append(dist)

        
    similars = 1 - np.array(distance)/max(distance)
    similars = similars.tolist()   

    if detail==1:
        print('---------characters recognition:-----------\n')
        print('relative similarity:')

        for i in range(10):
            print(i, ': %.2f    '%similars[i], end='')
        print('M', ': %.2f    '%similars[10], end='')
    
   #计算打印最相似结果作为匹配结果   
    res=similars.index(max(similars))

        
    if detail==1:
        if res!=10:
            print('\n**result: %d\n'%res)
        else:
            print('\n**result: %s\n'%'M')
    return res
